package com.dsbj.apolo.facecollector.utils.strprocess;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 字符串处理工具类。
 * @author cjw 2019-07-11
 */
public class StrUtil {
	
	/**
	 * 将object转化为jsonstr。
	 * @param object
	 * @return
	 */
	public static String tojsonstr(Object object){
		String str=null;
		str= JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);
		return str;
	}
	
	/**
	 * 将object转化为格式化的(SerializerFeature.PrettyFormat)jsonstr。
	 * @param object
	 * @return
	 */
	public static String toPrettyJsonStr(Object object){
		String str=null;
		str= JSON.toJSONString(object, SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat);
		return str;
	}
	
	/**
	 * 将object转换成字符串str,并输出到控制台,并返回该字符串str(不含有前缀prefix)。
	 * <br>前缀prefix用于控制台输出展示。
	 * @param prefix
	 * @param object
	 * @return
	 */
	public static String prettyPrint(String prefix,Object object){
		String str=null;
		str=JSON.toJSONString(object, SerializerFeature.WriteMapNullValue,SerializerFeature.PrettyFormat);
		System.out.println(prefix+"="+str);
		return str;
	}
	
	/**
	 * 将信息object输出到前端页面。
	 * @param response
	 * @param object
	 */
	public static void print_toView(HttpServletResponse response, Object object){
		String jsonstr = tojsonstr(object);
		try {
			response.getWriter().print(jsonstr);
			response.getWriter().flush();
			response.getWriter().close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 将"错误提示信息"输出到前端。
	 * @param response
	 * @param errMsg
	 */
	public static void printToView_error(HttpServletResponse response,String errMsg){
		Map<String,Object> map=new LinkedHashMap<>();
		map.put("code",0);
		map.put("success",false);
		map.put("msg",errMsg);
		print_toView(response,map);
	}
	
	/**
	 * 将"错误提示信息"输出到前端。
	 * @param
	 * @return
	 * @author cjw 2019-07-23
	 */
	public static void printToView_error(HttpServletResponse response, Exception e){
		Map<String,Object> map=new LinkedHashMap<>();
		map.put("code",0);
		map.put("success",false);
		//msg
		String msg=null;
		msg="传入的参数有误!"+ (StrUtil.isEmpty(e)? "": e.toString());
		map.put("msg",msg);
		print_toView(response,map);
	}
	
	/**
	 * 将"成功提示信息"输出到前端。
	 * @param response
	 * @param successMsg
	 */
	public static void printToView_success(HttpServletResponse response,String successMsg){
		Map<String,Object> map=new LinkedHashMap<>();
		map.put("code",1);
		map.put("success",true);
		map.put("msg",successMsg);
		print_toView(response,map);
	}
	
	/**
	 * 将"成功提示信息"输出到前端。
	 * @param response
	 */
	public static void printToView_success(HttpServletResponse response){
		Map<String,Object> map=new LinkedHashMap<>();
		map.put("code",1);
		map.put("success",true);
		map.put("msg","请求成功!");
		print_toView(response,map);
	}
	
	/**
	 * 请求成功,并将"查询结果"输出到前端。
	 * @param
	 * @return
	 * @author cjw 2019-07-25
	 */
	public static void printToView_success(HttpServletResponse response,Object object){
		Map<String,Object> map=new LinkedHashMap<>();
		map.put("code",1);
		map.put("success",true);
		map.put("msg","请求成功!");
		map.put("data",object);
		print_toView(response,map);
	}
	
	
	
	/**
	 * 若str==null,或str中each code<='\u005Cu0020'(the space character),返回true。
	 *
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		if (str == null || str.trim().length() == 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 若str==null,或str中each code<='\u005Cu0020'(the space character),返回true。
	 *
	 * @param object
	 * @return
	 */
	public static boolean isEmpty(Object object) {
		String str = null;
		str = (object == null ? null : object.toString());
		
		if (str == null || str.trim().length() == 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 返回一个object的字符串表示,不返回null。 <br>
	 * 返回object的字符串表示str。若str==null,或str中each code<='\u005Cu0020'(the space
	 * character),返回""。
	 *
	 * @param object
	 * @return snail 2018-12-26
	 */
	public static String getStrNotNull_fromObject(Object object) {
		String return_str = null;
		return_str = StrUtil.isEmpty(object) ? "" : object.toString();
		return return_str;
	}
	
	/**
	 * 返回一个object的字符串表示。若str==null,或str中each code<='\u005Cu0020'(the space
	 * character),返回null。
	 *
	 * @return cjw 2018-12-26
	 */
	public static String getStr_fromObject(Object object) {
		String str = StrUtil.isEmpty(object) ? null : object.toString().trim();
		return str;
	}
	
	/**
	 * 清洗str：根据分隔符(,|\\||\n)切分str,过滤掉空字符串(不含信息),并返回子字符串列表。
	 * @param
	 * @return
	 * @author cjw 2019-07-19
	 */
	public static List<String> splitExtractFromStr(String str){
		if(str==null){
			return null;
		}
		String[] str_array=str.trim().split(",|\\||\n");
		List<String> list_str=new ArrayList<>();
		
		for(String subStr: str_array){
			if(!StrUtil.isEmpty(subStr)){
				list_str.add(subStr.trim());
			}
		}
		return list_str;
	}
	
	/**
	 * 清除list_str中的重复记录。
	 * @param
	 * @return
	 * @author cjw 2019-07-24
	 */
	public static List<String> removeDuplicateRecord(List<String> list_str){
		if(list_str==null){
			return list_str;
		}
		
		List<String> list_strNew=new ArrayList<>();
		for(String str: list_str){
			//若list_strNew不含有str
			if(!list_strNew.contains(str)){
				list_strNew.add(str);
			}
		}
		return list_strNew;
	}
	
	/**
	 * 将字符串str转化为固定长度字符串str_new。
	 * 返回字符串的格式为：《AA...》
	 * @param
	 * @return
	 * @author cjw 2019-07-25
	 */
	public static String truncateStrToFixedLength(String str, int fixedLength){
		if(StrUtil.isEmpty(str)){
			return null;
		}
		
		if(str.length()<=fixedLength){
			return str;
		}else {
			String strNew=null;
			strNew=str.substring(0,fixedLength)+"...";
			return strNew;
		}
	}
	
	/**
	 * 将list_str转化为字符串,并使用separator分隔符。
	 * @param
	 * @return
	 * @author cjw 2019-07-29
	 */
	public static String convertList_toStr(List<String> list_str,String separator){
		if(list_str==null){
			return null;
		}
		
		StringBuffer strBuff=new StringBuffer();
		for(String str : list_str){
			strBuff.append(str+separator);
		}
		return strBuff.toString();
	}
	
	/**
	 * 从list_t中获取一个对象，并且当list_t包含多个对象(list_t.size()>1)时抛出异常。
	 * @param
	 * @return
	 * @author cjw 2019-09-02
	 */
	public static <T> T getItemFromList(List<T> list_t){
		if(list_t==null){
			return null;
		}
		if(list_t.size()==0){
			return null;
		}
		if(list_t.size()==1){
			return list_t.get(0);
		}
		if(list_t.size()>1){
			throw new RuntimeException("list_t中的对象数量应<=1,此处的对象数量超过了1!");
		}
		return null;
	}
	
}
